home *** CD-ROM | disk | FTP | other *** search
- *cX Low Level. Player de ficheros de Ondas
-
- *cR Seguro que alguna vez te has preguntado
- como podia un PC reproducir las voces y los
- sonidos como si fuera una grabadora. Yo no
- voy a contestarte esa pregunta (si todavia no
- lo sabes) en este artículo, pero lo que sí
- haré será mostrarte como programar un repro-
- ductor de ondas para la Sound Blaster. Supon-
- go que ya teneis un mínimo conocimiento de la
- tarjeta, de lo que es un fichero RAW de ondas
- y, por supuesto, de ensamblador. Un player de
- estas características puede programarse de
- varias formas, pero hoy solo veremos las 2
- más usuales en C y assembler.
-
- *cV Player mediante pooling
- *cR
- La primera forma y más sencilla, no requiere
- el uso del DMA, simplemente se reprograma el
- "timer" para que genere X interrupciones por
- segundo, donde X es la velocidad de sampleado
- que se usó al grabar la muestra (normalmente
- 11025, 22050 o 44100). A más interrupciones
- por segundo mayor calidad, pero también menos
- velocidad del ordenador (por lo que en una
- demo o juego no se puede usar). En realidad
- este sistema sólo se usa en programas donde
- se va reproduciendo un sample cada intervalo
- largo de tiempo a petición del usuario, y
- donde no pasa nada si el sistema se queda
- bloqueado hasta que finaliza el sonido (como
- en avisos de fallos del sistema; como Güin-
- dous).
- Para ilustrar este tipo de player he prepa-
- rado un fichero en C tipo libreria donde se
- encuentran todas las funciones listas para
- ser usadas. Si tienes cualquier problema no
- dudes en escribirnos, pero creo que todo está
- muy, muy clarito... Una única cosa, si llamas
- a la función *cFPLAY()*cR cuando termine el
- sonido se repetirá una y otra vez hasta que
- llames a *cFSTOP()*cR, mientras que si llamas a
- *cFPLAY_Once()*cR sólo se repetirá una vez.
- *cV
- Player mediante DMA
- *cR
- Ahora viene la chicha... Para que no os
- quejeis, el ejemplo más complicado os lo he
- hecho en assembler para que no tengais que
- calentaros la cabeza si no quereis. Se trata
- de un player ya preparado para funcionar que
- está internamente configurado para la IRQ 7
- (aunque no se usa), DMA 1 (muy importante) y
- puerto base 220h. Para cambiar estos valores
- por defecto, puedes editar el fichero
- *cFplay.inc*cR y cambiarlos en la cabecera, pero
- no te aseguro que te vayan a funcionar ya que
- no los he probado en ningún otra SB que no
- sea la mia. Seria muy recomendable que imple-
- mentases una función para detectar que puer-
- to, DMA y IRQ lleva la SB en el que se ejecu-
- tará el player (si no te aclaras enviame una
- e-mail o carta y veremos lo que se puede
- hacer).
- He dividido el programa en 2 ficheros para
- aislar las funciones de la SB y los datos del
- própio programa. Es de reseñar la sencillez
- de las 2 funciones que están implementadas en
- el fichero *cFplay.asm*cR, tanto *cFLeeRAW*cR como la
- principal usan únicamente funciones del DOS
- (ficheros, memoria y salida) y las funciones
- implementadas en el otro fichero a excepción
- del *cDOUT 20h <- 20h *cR que, como supondreis, se
- usa para indicar el final de una interrupción
- y que aquí sirve para resetear el controla-
- dor.
- En el fichero *cFplay.inc*cR nos encontramos
- con funciones interesantes como *cFWriteDSP*cR
- con la que se escribe al DSP (digital signal
- procesor) de la SB o *cFResetSB*cR. Mírate estas
- funciones ya que no las comentaré aquí pues
- están sobradamente comentadas en el fichero
- fuente.
- Vamos a centrarnos en la función *cFPlayBuffer*cR
- (observa que *cFPlayRAW*cR lo único que hace
- es llamar a *cFPlayBuffer*cR después de meter en
- DS el segmento almacenado en FS, pero era
- interesante mantener la función ya que de
- cara a ampliar la libreria será necesario
- retocarla). Lo primero que se hace en *cFPlay-
- Buffer*cR es calcular la dirección física del
- buffer y actualizar las variables usadas para
- controlar el DMA.
- Seguidamente se reprograma el controlador
- de DMA enviando los parámetros que habian
- sido calculados a partir del canal de DMA a
- usar. Esta reprogramación termina cuando se
- envia el comando de habilitación de canal
- DMA. Luego sigue una bifurcación que mira si
- se ha llamado anteriormente a la función
- (mediante la variable "veces") y en caso
- negativo ejecuta una série de ordenes orien
- tadas a la programación del DSP para que
- acepte el modo de reproducción deseado (8
- bits, mono/stereo). Luego se le envia el
- número de bytes por segundo a reproducir y se
- hace un acknowledge a la tarjeta. Antes de
- esto nos encontramos con un bucle que está
- inutilizado (con un punto y coma delante) que
- debia esperar hasta que el puerto de estatus
- del canal DMA que usemos indique la finaliza
- ción (puede que se te cuelgue si le quitas el
- punto y coma).
-
- Como habrás observado no es tan dificil
- programar un reproductor de ficheros de ondas
- mediante pooling ni con el DMA, pero si a
- pesar de todas estas explicaciones tienes
- algún problema, no dudes en hacermelo saber y
- trataré de despejarte todas las dudas. A
- partir de la base que aquí se ha presentado,
- se puede tratar de hacer un reproductor de
- MODs sencillito o un piano con las teclas,
- etc. Si consigues programar algo interesante
- envianoslo y lo publicaremos.
-
- *cM Navi Dj.
-
-